#include "Foto.h"

Foto::Foto()
{
    tam = 0;
}

Foto::Foto(int n, int m)
{
    matrix.resize(n);
    for(int i = 0; i < n; i++)
    {
        (matrix[i]).resize(m);
        for(int j = 0; j < m; j++)
        {
            matrix[i][j] = 0;
        }
    }
    tam=n;
}

void Foto::resize(int n, int m)
{
    matrix.resize(n);
    for(int i = 0; i < n; i++)
    {
        (matrix[i]).resize(m);
        for(int j = 0; j < m; j++)
        {
            matrix[i][j] = 0;
        }
    }
    tam=n;
}

Foto::~Foto(){}

int Foto::size()
{
    return tam;
}

void Foto::cargarImagen(FILE* imagen, int ancho, int alto){
    fpos_t initial_position;
    fgetpos(imagen, &initial_position);

    matrix.resize(alto);
    for(int x=0; x<alto; x++)
    {
        (matrix[x]).resize(ancho);
        for(int y=0; y< ancho; y++)
        {
            matrix[x][y]= fgetc(imagen);
        }
    }
    tam=alto;

    fsetpos (imagen, &initial_position);
}

void Foto::guardarImagen(FILE* imagen){
    int ancho; int alto;
    char basura [100];

    fseek(imagen,0,SEEK_SET);


    fgets(basura,100,imagen);
    cout <<"Indentifying file: "<< basura;
    fgets(basura,100,imagen);
    cout <<"Whitespace: "<< basura;

    ancho = cargarParam(imagen);
    cout <<"Width: "<< ancho << endl;

    alto = cargarParam(imagen);
    cout <<"Height: "<< alto << endl;

    fgets(basura, 5,imagen);
    cout <<"Maximum grayscale value: "<< basura << endl;

    matrix.resize(alto);
    for(int x=0; x<alto; x++)
    {
        (matrix[x]).resize(ancho);
        for(int y=0; y< ancho; y++)
        {
            matrix[x][y]= fgetc(imagen);
        }
    }
    tam=alto;

    fseek(imagen,0,SEEK_SET);
}


void Foto::set(int i , int j, int x)
{
    if(i > tam || j>tam)
    {
        cout<<"i > tam || j > tam!!!: \t i: "<<i<<" \t j: "<<j<<endl;
        exit(-1);
    }
    matrix[i][j] = x;
}


int Foto::get(int i, int j)
{
    if(i > tam || j>tam)
    {
        cout<<"i > tam || j > tam!!! \t \t i: "<<i<<" \t j: "<<j<<" \t tam: "<<tam<<endl;
        exit(-1);
    }
    return matrix[i][j];
}

vector<int>& Foto::operator[](int i)
{
    return matrix[i];
}


void Foto::print(int x)
{
    for(int i=0; i<tam; i++)
    {
        for(int j=0; j<tam; j++)
        {

            cout<< setprecision(x)<<setw(x)<<matrix[i][j]<<" ";
        }
        cout<<endl;
    }
}
